package com.medical.blood.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.medical.blood.entity.TestResult;
import com.medical.blood.mapper.TestResultMapper;
import org.springframework.stereotype.Service;
import java.util.Date;

import java.util.List;

@Service
public class TestResultService extends ServiceImpl<TestResultMapper, TestResult> {

    /**
     * 上传检测结果（医院系统调用）
     * @param result 检测结果（含样本ID、用户ID、指标等）
     * @return 上传结果
     */
    public boolean uploadResult(TestResult result) {
        // 校验样本-用户是否已关联
        if (lambdaQuery()
                .eq(TestResult::getSampleId, result.getSampleId())
                .eq(TestResult::getUserId, result.getUserId())
                .exists()) {
            throw new RuntimeException("该样本-用户组合已存在结果，无法重复上传");
        }
        return save(result);
    }

    /**
     * 更新检测状态（如“检测中”→“已出结果”）
     * @param sampleId 样本ID
     * @param newStatus 新状态
     * @param reportTime 报告时间（状态为“已出结果”时必填）
     * @return 更新结果
     */
    public boolean updateStatus(Long sampleId, Long userId,
                                String newStatus, Date reportTime) {
        LambdaQueryWrapper<TestResult> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(TestResult::getSampleId, sampleId)
                .eq(TestResult::getUserId, userId)
                .set(TestResult::getStatus, newStatus);

        if ("已出结果".equals(newStatus)) {
            wrapper.set(TestResult::getReportTime, reportTime);
        }
        return update(wrapper);
    }

    /**
     * 查询用户检测结果（小程序调用）
     * @param userId 用户ID
     * @return 检测结果列表（含历史记录）
     */
    public List<TestResult> listByUserId(Long userId) {
        return lambdaQuery()
                .eq(TestResult::getUserId, userId)
                .orderByDesc(TestResult::getCreateTime) // 按时间倒序
                .list();
    }

    /**
     * 查询单个检测结果详情（含状态、报告时间）
     * @param sampleId 样本ID
     * @param userId 用户ID
     * @return 检测结果详情
     */
    public TestResult getDetail(Long sampleId, Long userId) {
        return lambdaQuery()
                .eq(TestResult::getSampleId, sampleId)
                .eq(TestResult::getUserId, userId)
                .one();
    }
}